/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKCompraNotaCredito;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioNumeroALetras;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraDetalleNotaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraNotaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.entidad.CompraDetalleNotaCredito;
import pe.com.cotelasa.scp.entidad.CompraNotaCredito;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBCompraNotaCredito")
@Scope("request")
public class MBCompraNotaCredito extends MBGenerico implements IMantenedor, IObserver, Serializable {
    
    private static Logger logger = Logger.getLogger(MBCompraNotaCredito.class);
    @Inject
    private BKCompraNotaCredito bk;
    @Inject
    private IServicioCompraNotaCredito servicio;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private IServicioCompraDetalleNotaCredito servicioDetalle;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private MBComponenteFindProveedor mbComponenteFindProveedor;
    @Inject
    private MBCompraDetalleNotaCredito mbCompraDetalleNotaCredito;
    @Autowired
    BKSession session;
    
    public void buscarListaNotasCredito() {
        try {
            bk.setListaNotaCredito(servicio.obtenerCompraNotaCreditoBusqueda(
                    bk.getNotaCreditoBusqueda(), bk.getBusquedaDel(), bk.getBusquedaAl()));

        } catch (ServiceException                            e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrar() {

        CompraNotaCredito notacredito = new CompraNotaCredito();
        notacredito.setNumnc("");
        notacredito.setRuc("");
        notacredito.setRazon("");
        bk.setNotaCreditoBusqueda(notacredito);
        bk.setBusquedaDel(null);
        bk.setBusquedaAl(null);
        bk.setListaNotaCredito(null);
        try {
            bk.setListaTipoMoneda(servicioTipoMoneda.listarTipoMonedasActivos());
            bk.setListaMotivoEmision(new ArrayList<ParametroDetalle>(servicioParametro.listaTipoMotivoNotaCredito()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_DEBITO;
        }
        

        return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
    }
    
    
    @Override
    public String nuevo() {
        mbComponenteFindProveedor.clearObserver();
        mbComponenteFindProveedor.addObserver(this);
        mbCompraDetalleNotaCredito.clearObserver();
        mbCompraDetalleNotaCredito.addObserver(this);
        bk.setComando(new ComandoGuardar(this));

        try {
            CompraNotaCredito notacredito = new CompraNotaCredito();
            notacredito.setIdSede(session.getSede());

            bk.setDetalleSeleccionado(null);
            bk.setNotaCreditoFormulario(notacredito);
            bk.setListaTipoMoneda(servicioTipoMoneda.listarTipoMonedasActivos());
            bk.setListaDetalleNotaCredito(new ArrayList <CompraDetalleNotaCredito>());


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
        }

        return URLPaginacion.CompraNotaCredito.URL_FORMULARIO_COMPRA_NOTA_CREDITO;
    }
    
    @Override
    public String editar() {
        mbComponenteFindProveedor.clearObserver();
        mbComponenteFindProveedor.addObserver(this);
        mbCompraDetalleNotaCredito.clearObserver();
        mbCompraDetalleNotaCredito.addObserver(this);
        bk.setComando(new ComandoActualizar(this));
        try {
            bk.setDetalleSeleccionado(null);
            bk.setListaDetalleNotaCredito(new ArrayList<CompraDetalleNotaCredito>());
            //bk.setIdTipoMoneda(servicioVentaNotaDebito.obtenerIdMonedaNotaDebito(bk.getNotaCreditoFormulario().getCodnd()));
            bk.setListaDetalleNotaCredito((List<CompraDetalleNotaCredito>) servicioDetalle.buscarDetallesNotaCredito(bk.getNotaCreditoFormulario().getId()));
            return URLPaginacion.CompraNotaCredito.URL_FORMULARIO_COMPRA_NOTA_CREDITO;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
        }
    }

    @Override
    public String guardar() {
        try {
            //bk.getVentaNotaDebitoFormulario().setMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bk.getIdTipoMoneda()));
            bk.getNotaCreditoFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            bk.getNotaCreditoFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bk.getNotaCreditoFormulario().setFecCreacion(new Date());
            
            bk.getNotaCreditoFormulario().setSerienc(UtilitarioCadenas.formatoSerieDocumento(Integer.parseInt(bk.getNotaCreditoFormulario().getSerienc())));
            bk.getNotaCreditoFormulario().setNumnc(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bk.getNotaCreditoFormulario().getNumnc())));
            
            for (CompraDetalleNotaCredito det : bk.getListaDetalleNotaCredito()) {
                System.out.println("det: "+det.getDescripcion());
                det.setFecCreacion(new Date());
                det.setIdCompraNotaCredito(bk.getNotaCreditoFormulario());
            }
            bk.getNotaCreditoFormulario().setCompraDetalleNotaCreditoCollection(bk.getListaDetalleNotaCredito());
            servicio.guardarCompraNotaCredito(bk.getNotaCreditoFormulario());
            mostrarMensaje("Se guardó la Nota de Débito satisfactoriamente.");
            buscarListaNotasCredito();
            return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
            //return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.CompraNotaCredito.URL_FORMULARIO_COMPRA_NOTA_CREDITO;
        }
    }
    
    @Override
    public String actualizar() {
        try {
            bk.getNotaCreditoFormulario().setUsrModificacion(session.getUsuario().getUsuario());
            bk.getNotaCreditoFormulario().setFecModificacion(new Date());
            
            bk.getNotaCreditoFormulario().setSerienc(UtilitarioCadenas.formatoSerieDocumento(Integer.parseInt(bk.getNotaCreditoFormulario().getSerienc())));
            bk.getNotaCreditoFormulario().setNumnc(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bk.getNotaCreditoFormulario().getNumnc())));
            
            System.out.println("formulario: "+bk.getNotaCreditoFormulario());
            //guardamos el detalle
            for (CompraDetalleNotaCredito det : bk.getListaDetalleNotaCredito()) {
                System.out.println("entroooo");
                if (det.getId() == null) {
                    System.out.println("en troooo");
                    det.setIdCompraNotaCredito(bk.getNotaCreditoFormulario());
                }
            }
            bk.getNotaCreditoFormulario().setCompraDetalleNotaCreditoCollection(new ArrayList<CompraDetalleNotaCredito>());

            bk.getNotaCreditoFormulario().getCompraDetalleNotaCreditoCollection().addAll(bk.getListaDetalleNotaCredito());

            servicio.actualizarCompraNotaCredito(bk.getNotaCreditoFormulario());
            buscarListaNotasCredito();
            //return URLPaginacion.Ventas.URL_FORMULARIO_EDITAR_NOTA_DEBITO;
            mostrarMensaje("Se actualizó la Nota de Débito satisfactoriamente.");

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.CompraNotaCredito.URL_FORMULARIO_COMPRA_NOTA_CREDITO;
        }
        return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
    }
    
    public void convertirALetra() {
        if (bk.getNotaCreditoFormulario().getTotal() != null && bk.getNotaCreditoFormulario().getMoneda() != null) {
            UtilitarioNumeroALetras valorLetras = new UtilitarioNumeroALetras();
            DecimalFormat decf = new DecimalFormat("###.##");

            bk.getNotaCreditoFormulario().setTotalletras(valorLetras.Convertir(decf.format(bk.getNotaCreditoFormulario().getTotal()), true,
                    bk.getNotaCreditoFormulario().getMoneda().getNombre()));
        }

    }
    

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    public void eliminarDetalle() {
        System.out.println("entro: "+ bk.getDetalleSeleccionado().getId());
        
        if (bk.getDetalleSeleccionado().getId() == null) {
            System.out.println("entro pq es nuevo");
            Iterator itr = bk.getListaDetalleNotaCredito().iterator();
            while (itr.hasNext()) {
                CompraDetalleNotaCredito det = (CompraDetalleNotaCredito) itr.next();

                if (bk.getDetalleSeleccionado().getDescripcion().equalsIgnoreCase(det.getDescripcion())) {
                    itr.remove();
                    break;
                }
            }
        } else {
            System.out.println("entro pq es viejo");
            Integer index = bk.getListaDetalleNotaCredito().indexOf(bk.getDetalleSeleccionado());
            bk.getDetalleSeleccionado().setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            bk.getDetalleSeleccionado().setUsrModificacion(session.getUsuario().getUsuario());
            bk.getDetalleSeleccionado().setFecModificacion(new Date());
            this.bk.getListaDetalleNotaCredito().set(index, bk.getDetalleSeleccionado());
        }
        System.out.println("lista: " + bk.getListaDetalleNotaCredito());
        actualizarTotales();

    }

    public boolean isRenderedColumn(Character estado) {
        String estadoS = "" + estado;
        /*if(estado == ' '){
            estadoS = "";
            System.out.println("entro1 : " + estadoS);
        }else{
            estadoS = "" + estado;
            System.out.println("entro2 : " + estadoS);
        }*/
        return !estadoS.equalsIgnoreCase("I");
    }
    

    @Override
    public String ver() {
        try {
            bk.setNotaCreditoFormulario(servicio.conseguirCompraNotaCreditoPorId(bk.getNotaCreditoFormulario().getId()));
        
            return URLPaginacion.CompraNotaCredito.URL_VER_COMPRA_NOTA_CREDITO;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
        }
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        return URLPaginacion.CompraNotaCredito.URL_CONSULTAR_COMPRA_NOTA_CREDITO;
    }
    
    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Proveedor) {
            Proveedor proveedor = (Proveedor) object;
            bk.getNotaCreditoFormulario().setIdProveedor(proveedor);
            bk.getNotaCreditoFormulario().setRuc(proveedor.getRuc());
            bk.getNotaCreditoFormulario().setRazon(proveedor.getRazonSocial());
            bk.getNotaCreditoFormulario().setDireccion(proveedor.getDireccionLegal());
        }

        if (object instanceof CompraDetalleNotaCredito) {

            CompraDetalleNotaCredito detalle = (CompraDetalleNotaCredito) object;
            detalle.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            detalle.setUsrCreacion(session.getUsuario().getUsuario());
            detalle.setFecCreacion(new Date());
            bk.getListaDetalleNotaCredito().add(detalle);
            actualizarTotales();
        }

    }
    
    public void actualizarTotales() {
        try {
            BigDecimal total = new BigDecimal(0);
            BigDecimal subtotal = new BigDecimal(0);
            BigDecimal igv = new BigDecimal(0);
            for (CompraDetalleNotaCredito detalle : bk.getListaDetalleNotaCredito()) {
                if(detalle.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()){
                
                subtotal = subtotal.add(detalle.getImporte());
                }
                
            }

            igv = servicioIgv.ConseguirIgvPorFecha(bk.getNotaCreditoFormulario().getFechanc()).getMonto().multiply(subtotal.divide(new BigDecimal(100)));
            total = subtotal.add(igv);

            bk.getNotaCreditoFormulario().setValorVenta(subtotal);
            bk.getNotaCreditoFormulario().setIgv(igv);
            bk.getNotaCreditoFormulario().setTotal(total);
            convertirALetra();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }


    }
    
    public void marcarFecha(DateSelectEvent event) {

        TipoCambio tipo = new TipoCambio();
        tipo.setFecCreacion(event.getDate());
        try {
            tipo = servicioTipoCambio.ValidarTipoCambio(tipo);

            if (tipo == null) {

                bk.getNotaCreditoFormulario().setFechanc(null);
                bk.getNotaCreditoFormulario().setTipocambio(null);
                mostrarError("No se ha registrado tipo de cambio para el " + UtilitarioFecha.formatearFecha(event.getDate(), "d/M/Y"));
            } else {
                bk.getNotaCreditoFormulario().setTipocambio(tipo.getVenta());
            }
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }
    
    public String buscarMotivoEmision(int i){
        String motivoE = "";
        for(ParametroDetalle motivo:bk.getListaMotivoEmision()){
            if(motivo.getValNumerico().intValue() == i){
                motivoE = motivo.getDesParametroDet();
                break;
            }
        }
        return motivoE;
    }
    
}
